package lv.servidordisqueria.repositorio;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import lv.mensajeriadisqueria.idomain.IRol;
import lv.servidordisqueria.domain.Rol;
import lv.servidordisqueria.excepcion.DomainNoExistenteException;
import lv.servidordisqueria.persistencia.ConeccionBaseDatos;

/**
 * Este es el repositorio de roles, maneja todos los roles de la base de datos.
 */
public class RolRepositorio implements RepositorioJDBC<IRol> {
	
	private static RolRepositorio INSTANCE = null;
	 
	private RolRepositorio() {}
	 
	// creador sincronizado para protegerse de posibles problemas  multi-hilo
	// otra prueba para evitar instanciación múltiple 
	private synchronized static void crearInstance() {
		if (INSTANCE == null) { 
			INSTANCE = new RolRepositorio();
		}
	}

	public static RolRepositorio getInstance() {
		if (INSTANCE == null) 
			crearInstance();
		return INSTANCE;
	}

	@SuppressWarnings("null")
	@Override
	public List<IRol> buscar(String columna, Object valor) throws SQLException, DomainNoExistenteException {
		List<IRol> roles = new ArrayList<IRol>();
		if ((columna != null || !columna.isEmpty()) && (valor != null)) {
			Statement st = null;
			try {
				st = ConeccionBaseDatos.getInstance().getConnection().createStatement();
				if (valor instanceof String) {
					valor = "'" + valor + "'";
				}
				String query = ("SELECT * FROM ROL WHERE " + columna + " = "+ valor +";");
				ResultSet rs = st.executeQuery(query);
				while (rs.next()) {
					IRol iRol = new Rol();
					iRol.setIdRol(rs.getInt(1));
					iRol.setNombre(rs.getString(2));
					
					if(rs.getString(3).equalsIgnoreCase("S"))
							iRol.setHabilitado(true);
						else
							iRol.setHabilitado(false);
					roles.add(iRol);
				}
				if(roles.isEmpty()){
					throw new DomainNoExistenteException();
				}
			} finally {
				if (st != null) {
					st.close();
				}
			}
		}
		return roles;
	}

	@Override
	public IRol buscarPorId(Integer id) throws SQLException, DomainNoExistenteException {
		return buscar("ID_ROL", id).get(0);
	}

	@Override
	public List<IRol> buscarTodos() throws SQLException, DomainNoExistenteException{
		return buscar("1", "1");
	}

	@Override
	public IRol insertar(IRol iRol) throws SQLException, DomainNoExistenteException {
		IRol rolGuardado = iRol;
		PreparedStatement st = null;
		try {
			String query = "INSERT INTO ROL (NOMBRE) VALUES ('" + 
				iRol.getNombre()+"');";
			st = ConeccionBaseDatos.getInstance().getConnection().prepareStatement(query);
			st.executeUpdate();
			rolGuardado = buscar("NOMBRE", iRol.getNombre()).get(0);
		} finally {
			if (st != null ) {
				st.close();
			}
		}
		return rolGuardado;
	}
	
	@Override
	public void borrar(IRol entity) throws SQLException {
		// TODO Implementar y Verificar el borrado en cascada
		
	}

	@Override
	public void editar(IRol iRol) throws SQLException {
		PreparedStatement st = null;
		try {
			String query = "UPDATE ROL SET NOMBRE = '" + iRol.getNombre()+"' WHERE ID_ROL = '" 
					+ iRol.getIdRol() +"';";
			st = ConeccionBaseDatos.getInstance().getConnection().prepareStatement(query);
			st.executeUpdate();
		} finally {
			if (st != null) {
				st.close();
			}
		}
	}

	//TODO verificar que no borra las relaciones, en estos momentos borra solo la entidad
	@Override
	public void borradoFisico(IRol iRol) throws SQLException {
		PreparedStatement st = null;
		try {
			String query = "DELETE FROM ROL WHERE ID_ROL = " + iRol.getIdRol() +";";
			st = ConeccionBaseDatos.getInstance().getConnection().prepareStatement(query);
			st.executeUpdate();
		} finally {
			if (st != null) {
				st.close();
			}
		}
	}
}